package com.edu.exam.entity.examination.control;

import com.edu.exam.enums.examination.AnswerType;
import com.edu.exam.enums.examination.AnswerStatus;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.Duration;
import java.time.LocalDateTime;

/**
 * 答题数据实体类
 * 所属模块：E-01 考试执行模块
 * 对应数据库表：answer_data
 *
 * <p>答题数据实体用于存储和管理学生的答题数据，包括答案内容、答题类型、
 * 用时统计、状态管理等。支持多种题型和详细的答题过程跟踪。</p>
 *
 * <p>核心功能：
 * - 答案存储：存储各种类型的答案数据
 * - 状态管理：管理答案的保存、修改、提交状态
 * - 时间跟踪：跟踪答题用时和修改历史
 * - 内容验证：验证答案格式的有效性
 * - 版本控制：支持答案的版本管理和回滚</p>
 *
 * @author System
 * @version 1.0.0
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@EntityListeners(AuditingEntityListener.class)
public class AnswerData {

    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 答案ID
     *
     * <p>答案数据的唯一标识符，采用UUID格式生成。</p>
     */
    @Column(name = "answer_id", nullable = false, length = 32, unique = true)
    private String answerId;

    /**
     * 会话ID
     *
     * <p>关联的答题控制会话ID。</p>
     */
    @Column(name = "session_id", nullable = false, length = 32)
    private String sessionId;

    /**
     * 题目ID
     *
     * <p>对应的题目ID。</p>
     */
    @Column(name = "question_id", nullable = false, length = 32)
    private String questionId;

    /**
     * 学生ID
     *
     * <p>答题学生的ID。</p>
     */
    @Column(name = "student_id", nullable = false, length = 32)
    private String studentId;

    /**
     * 答题类型
     *
     * <p>答案的类型。
     * 支持的类型：SINGLE_CHOICE（单选题）、MULTIPLE_CHOICE（多选题）、TRUE_FALSE（判断题）、FILL_BLANK（填空题）、ESSAY（论述题）、PROGRAMMING（编程题）、FILE_UPLOAD（文件上传）、DRAG_DROP（拖拽题）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "answer_type", nullable = false, length = 50)
    private AnswerType answerType;

    /**
     * 答案内容
     *
     * <p>JSON格式的答案内容。</p>
     */
    @Column(name = "answer_content", columnDefinition = "LONGTEXT")
    private String answerContent;

    /**
     * 答案详情
     *
     * <p>JSON格式的答案详细数据。</p>
     */
    @Column(name = "answer_details", columnDefinition = "LONGTEXT")
    private String answerDetails;

    /**
     * 用时（秒）
     *
     * <p>答题用时（秒）。</p>
     */
    @Column(name = "time_spent")
    private Integer timeSpent = 0;

    /**
     * 尝试次数
     *
     * <p>答案修改的尝试次数。</p>
     */
    @Column(name = "attempt_count")
    private Integer attemptCount = 0;

    /**
     * 首次答题时间
     *
     * <p>首次答题的时间。</p>
     */
    @Column(name = "first_answer_time")
    private LocalDateTime firstAnswerTime;

    /**
     * 最后修改时间
     *
     * <p>答案最后修改的时间。</p>
     */
    @Column(name = "last_modify_time")
    private LocalDateTime lastModifyTime;

    /**
     * 答案状态
     *
     * <p>答案的状态。
     * 支持的状态：DRAFT（草稿）、SAVED（已保存）、MODIFIED（已修改）、FINAL（最终）、SUBMITTED（已提交）、AUTO_SAVED（自动保存）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "answer_status", nullable = false, length = 20)
    private AnswerStatus answerStatus = AnswerStatus.DRAFT;

    /**
     * 是否标记复习
     *
     * <p>标记是否需要复习该题目。</p>
     */
    @Column(name = "is_marked_for_review")
    private Boolean isMarkedForReview = false;

    /**
     * 是否标记异常
     *
     * <p>标记该题目是否有异常。</p>
     */
    @Column(name = "is_flagged")
    private Boolean isFlagged = false;

    /**
     * 异常原因
     *
     * <p>标记异常的原因。</p>
     */
    @Column(name = "flag_reason", length = 500)
    private String flagReason;

    /**
     * 答案分数
     *
     * <p>答案的得分。</p>
     */
    @Column(name = "answer_score", precision = 5, scale = 2)
    private Float answerScore;

    /**
     * 答案备注
     *
     * <p>答案的备注信息。</p>
     */
    @Column(name = "answer_notes", columnDefinition = "TEXT")
    private String answerNotes;

    /**
     * 答案标签
     *
     * <p>JSON格式的答案标签。</p>
     */
    @Column(name = "answer_tags", columnDefinition = "TEXT")
    private String answerTags;

    /**
     * 修改历史
     *
     * <p>JSON格式的答案修改历史。</p>
     */
    @Column(name = "modification_history", columnDefinition = "LONGTEXT")
    private String modificationHistory;

    /**
     * 自动保存数据
     *
     * <p>JSON格式的自动保存数据。</p>
     */
    @Column(name = "auto_save_data", columnDefinition = "TEXT")
    private String autoSaveData;

    /**
     * 验证结果
     *
     * <p>JSON格式的答案验证结果。</p>
     */
    @Column(name = "validation_result", columnDefinition = "TEXT")
    private String validationResult;

    /**
     * 客户端IP
     *
     * <p>提交答案的客户端IP地址。</p>
     */
    @Column(name = "client_ip", length = 45)
    private String clientIp;

    /**
     * 用户代理
     *
     * <p>提交答案的浏览器用户代理。</p>
     */
    @Column(name = "user_agent", length = 500)
    private String userAgent;

    // ===== 审计字段 =====

    /**
     * 创建时间
     */
    @CreatedDate
    @Column(name = "create_time", nullable = false, updatable = false)
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    @LastModifiedDate
    @Column(name = "update_time", nullable = false)
    private LocalDateTime updateTime;

    /**
     * 版本号
     */
    @Column(name = "version", nullable = false)
    private Integer version = 1;

    /**
     * 是否删除
     */
    @Column(name = "is_deleted", nullable = false)
    private Boolean isDeleted = false;
}